# -*- coding: utf-8 -*-
"""
Created on Tue Aug 22 19:45:41 2023

@author: skunk69
"""

import json

chinese_name = u'简明精神病量表'
english_name = 'the Breif Psychiatric Rating Scale'
abbreviation = 'BPRS'
category = u'精神病学临床量表'

outline = u"""简明精神病评定量表(Brief Psychiatric Rating Scale, BPRS)是一个评定精神病性症状严重程度的他评量表，主要用于精神分裂症患者及具有精神病性症状的其他精神病患者。可用于精神科临床，作为精神分裂症患者病情严重程度和精神病理表现的描述指标。"""

instruction = u"""主要评定最近一周内病人的精神症状及现场交谈情况，分为7级评分（①无，②很轻，③轻度，④中度，⑤偏重，⑥重度，⑦极重），根据症状强度、频度、持续时间和影响有关功能的程度，选择出最适合病人的答案。"""

with open('BPRS.txt','r',encoding='utf-8') as f:
    lines = f.readlines()
    f.close()

lines_items = [l.strip() for l in lines[0:20]]
lines_items_definition = [l.strip() for l in lines[20:40]]
lines_rating_standard = [l.strip() for l in lines[40::]]

# 依据口头叙述，1，2，4，5，8，9，10，11，12，15，18，19，20
# 依据检测观察，3，6，7，13，14，17
str_list = [1,2,4,5,8,9,10,11,12,15,18,19,20]
items = {}
for num,line in enumerate(lines_items):
    key,value = line.split('、',maxsplit=1)
    if num+1 in str_list:
        value = value+'（依据口头叙述）'
    else:
        value = value+'（依据检测观察）'
    items[key] = value

items_definition = {}
for line in lines_items_definition:
    key,value = line.split('、',maxsplit=1)
    items_definition[key] = value
    
rating_standard = {}
for num,line in enumerate(lines_rating_standard[::8]):
    item = {}
    key,value = line.split('、',maxsplit=1)
    item[key] = value.strip()
    rate = {}
    lines_rate = lines_rating_standard[num*8+1:(num+1)*8]
    for i in range(len(lines_rate)):
        rate[i+1] = lines_rate[i].strip()
    rating_standard[key] = [item,rate]

reverse_items = []
"""
（1）．焦虑忧郁，包括1、2、5、9四项。
（2）．缺乏活力，包括3、13、16、18四项。
（3）．思维障碍，包括4、8、12、15四项。
（4）．激活性，包括6、7、17三项。
（5）．敌对性，包括10、11、14三项。
"""
scales = [u'焦虑忧郁',u'缺乏活力',u'思维障碍',u'激活性',u'敌对性']
scales_items = [
    [1,2,5,9],# 焦虑忧郁
    [3,13,16,18],# 缺乏活力
    [4,8,12,15],# 思维障碍
    [6,7,17],# 激活性
    [10,11,14],# 敌对性
    ]

# check scales_items
print(f'scale length={[len(l) for l in scales_items]}')

check = []
for l in scales_items:
    check = check+l
print(f'len(check)={len(check)}')

# complementary set
check_set = {i for i in sorted(check)}^{i for i in range(1,19)}
print(f'complementary set= {check_set}')

factors = []
factors_scales = []
# ①无，②很轻，③轻度，④中度，⑤偏重，⑥重度，⑦极重
rating = [u'无',u'很轻',u'轻度',u'中度',u'偏重',u'重度',u'极重']
score_rules = list(range(1,8))

contents = {
    'instruction':instruction,
    'items':items,
    'items_definition':items_definition,
    'rating_standard':rating_standard,
    'reverse_items':reverse_items,
    'scales':scales,
    'scales_items':scales_items,
    'factors':factors,
    'factors_scales':factors_scales,
    'rating':rating,
    'score_rules':score_rules       
    }

implementation = u"""《简明精神病量表》是一个他评量表。评定注意事项：
（1）评定员由经过训练的精神科专业人员担任。
（2）量表评定由评定员对患者进行量表精神检查后，分别根据患者的口头表述和对患者的观察情况，依据症状定义和临床经验（可参考他人制订的工作用评定标准）进行评分。其中，第1，2，4，5，8，9，10，11，12，15，16和18项（以及全国量表协作研究组增加的第19和20项），根据量表检查时患者的回答评分；第3，6，7，13，14，17项，根据对患者的观察评分。另外，第16项除按原作者的依据口头表述评分之外，还需结合观察评分。
（3）一次评定大约需作20分钟的会谈和观察。评定的时间范围：一般为评定前一周的情况。以后一般相隔2～6周评定一次。"""

reliability = u"""对36例住院精神分裂症患者，其中三分之一为首次住院患者的BPRS评定，总分分布为26~76。联合检查一致性Pearson相关系数为0.85~0.99；相隔2天的重测总分的一致性相当好（r=0.52），但具体项目间还是有些差别的。"""
validity = u"""该量表的总分与临床医师判断的临床严重度的Spearman等级相关性r=0.8，与临床疗效判断的相关性r=0.6。
对不同精神病的评定结果做因子分析显示，BPRS能大体反映精神分裂症、躁狂症、抑郁症和神经症的症状特点：精神分裂症患者各因子分均较高，尤其是敌对猜疑和思维障碍，其余三种则只有个别因子高，如躁狂症患者的因子分高值集中在思维障碍和激活性，抑郁症和神经症只有焦虑抑郁因子分高。"""
measurements = {'reliability':reliability,'validity':validity}

interpretation = u"""BPRS的结果可按单项，因子分和总分进行分析。其中，总分(18～126分)，总分反映疾病严重性，总分越高，病情越重。治疗前后总分值的变化反映疗效的好坏，差值越大疗效越好。治疗前后各症状（单项）或症状群（因子）的评分变化可反映对靶症状的治疗效果。因BPRS为分级量表，所以能够比较细致地反映疗效。"""

applications = u"""（1）该量表是在精神科广泛应用的专业评定量表之一，常作为验证新的精神分裂症或精神病性症状评定量表的参照工具。
（2）该量表长度适中，既能比较全面地反映患者的精神状况，又比较简便，容易掌握，为大多数精神科工作者所接受。
（3）项目设置比较合理，主要的精神病性症状，尤其是精神分裂症的主要临床症状基本都能加以评估，欠缺的是对阴性症状的反映不足。
（4）为专业人员所设计的7级评分，能较敏感、细致地反映精神症状的变化，但由于缺乏分级的操作性标准，评分的准确性和一致性就比较难以把握。
（5）经广泛使用，BPRS具有良好的信度和效度。中文版的信度和效度检验在1980年代初期已有报道。"""

this_scale = {
    'chinese_name':chinese_name,
    'english_name':english_name,
    'abbreviation':abbreviation,
    'category':category,
    'outline':outline,
    'contents':contents,
    'implementation':implementation,
    'measurements':measurements,
    'interpretation':interpretation,
    'applications':applications    
    }

with open(abbreviation+'.json','w+',encoding='utf-8') as f:
    json.dump(this_scale,f,indent=2,ensure_ascii=False)